{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 1. 简介\n",
    "\n",
    "- 主页 | https://tsfresh.com/\n",
    "- 文档 | https://tsfresh.readthedocs.io/en/latest/\n",
    "- Github | https://github.com/blue-yonder/tsfresh\n",
    "- Stars | 7.1k\n",
    "- 协议 | MIT\n",
    "\n",
    "tsfresh 是一个用于时间序列特征生成的python包。使用tsfresh可以自动计算出大量的时间序列特征，tsfresh还内置有特征筛选算法可以挑选出和任务有关的特征。提取的特征可用于描述时间序列，这些特征可以用于下游的时间序列任务，如股票价格预测、天气预测、景点人流预测、时尚商品销量预测、商品推荐系统等。\n",
    "\n",
    "tfresh的特点：\n",
    "\n",
    "- 安装方便，使用简单；\n",
    "- 内置数百个在各个领域验证有效的特征生成函数可调用；\n",
    "- 支持设置目标进行特征过滤；\n",
    "- 支持自定义新的特征函数；\n",
    "- 支持对滚动时间序列提取特征；\n",
    "- 支持使用Dask在处理大样本数据；\n",
    "- 支持进行并行化加速；\n",
    "- 可以和scikit-learn进行结合使用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "# 如果没有安装，解注释如下代码\n",
    "# !pip install -U tsfresh"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "# 引入头文件\n",
    "import qstock as qs\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pylab as plt\n",
    "\n",
    "from tsfresh import extract_features, select_features\n",
    "from tsfresh.utilities.dataframe_functions import roll_time_series, make_forecasting_frame\n",
    "from tsfresh.utilities.dataframe_functions import impute\n",
    "\n",
    "from sklearn.ensemble import AdaBoostRegressor"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 2. 数据获取\n",
    "\n",
    "本文使用qstock获取历史行情数据：https://github.com/tkfy920/qstock\n",
    "\n",
    "读者直接在cmd或anaconda prompt上输入“pip install qstock ”进行安装，\n",
    "或输入“pip install -upgrade qstock”进行更新。\n",
    "\n",
    "- 历史K线  \n",
    "  获取单只或多只证券（股票、基金、债券、期货)的历史K线数据。可以根据realtime_data实时行情接口获取相应金融市场交易标的的代码或简称，用于获取其历史K线数据。\n",
    "\n",
    "    - get_data(code_list, start='19000101', end=None, freq='d', fqt=1)\n",
    "\n",
    "   \n",
    "   获取股票、指数、债券、期货、基金等历史K线行情。参数说明：\n",
    "\n",
    "    - code_list输入股票list列表，如code_list=['中国平安','贵州茅台','工业富联'] ，返回多只股票多期时间的面板数据\n",
    "    - start和end为起始和结束日期，年月日\n",
    "    - freq:时间频率，默认日，1 : 分钟；5 : 5 分钟；15 : 15 分钟；30 : 30 分钟； 60 : 60 分钟；101或'D'或'd'：日；102或‘w’或'W'：周; 103或'm'或'M': 月 注意1分钟只能获取最近5个交易日一分钟数据\n",
    "    - fqt:复权类型，0：不复权，1：前复权；2：后复权，默认前复权"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "outputs": [
    {
     "name": "stderr",
     "text": [
      "100%|██████████| 1/1 [00:00<00:00,  3.78it/s]"
     ],
     "output_type": "stream"
    },
    {
     "name": "stdout",
     "text": [
      "            name    code    open    high     low   close   volume  \\\n",
      "date                                                                \n",
      "2022-01-04  中国平安  601318  124.83  126.15  124.23  126.03   635838   \n",
      "2022-01-05  中国平安  601318  126.25  128.83  125.97  128.17  1181247   \n",
      "2022-01-06  中国平安  601318  128.01  128.07  126.47  126.63   661658   \n",
      "2022-01-07  中国平安  601318  127.01  130.69  126.93  129.91  1230760   \n",
      "2022-01-10  中国平安  601318  130.01  131.15  129.03  130.19   761134   \n",
      "\n",
      "                turnover  turnover_rate  \n",
      "date                                     \n",
      "2022-01-04  3.221367e+09           0.59  \n",
      "2022-01-05  6.124174e+09           1.09  \n",
      "2022-01-06  3.408948e+09           0.61  \n",
      "2022-01-07  6.481039e+09           1.14  \n",
      "2022-01-10  4.033301e+09           0.70  \n",
      "shape:  (276, 9)\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "code_list=['中国平安']  # 股票列表\n",
    "df = qs.get_data(code_list, start='20220101', end='20230226', freq='d', fqt=2)\n",
    "print(df.head())\n",
    "print('shape: ', df.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 3. 数据处理"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [
    {
     "name": "stderr",
     "text": [
      "D:\\ProgramFiles\\anaconda3\\lib\\site-packages\\tsfresh\\utilities\\dataframe_functions.py:520: UserWarning: Your time stamps are not uniformly sampled, which makes rolling nonsensical in some domains.\n",
      "  warnings.warn(\n",
      "\n",
      "Rolling:   0%|          | 0/28 [00:00<?, ?it/s]\u001b[A\n",
      "Rolling:   4%|▎         | 1/28 [00:08<03:46,  8.40s/it]\u001b[A\n",
      "Rolling:  14%|█▍        | 4/28 [00:08<02:21,  5.89s/it]\u001b[A\n",
      "Rolling:  36%|███▌      | 10/28 [00:08<01:14,  4.13s/it]\u001b[A\n",
      "Rolling: 100%|██████████| 28/28 [00:08<00:00,  3.19it/s]\u001b[A\n"
     ],
     "output_type": "stream"
    },
    {
     "name": "stdout",
     "text": [
      "   name    open    high     low   close   volume      turnover  turnover_rate  \\\n",
      "0  中国平安  124.83  126.15  124.23  126.03   635838  3.221367e+09           0.59   \n",
      "1  中国平安  126.25  128.83  125.97  128.17  1181247  6.124174e+09           1.09   \n",
      "2  中国平安  128.01  128.07  126.47  126.63   661658  3.408948e+09           0.61   \n",
      "3  中国平安  127.01  130.69  126.93  129.91  1230760  6.481039e+09           1.14   \n",
      "4  中国平安  130.01  131.15  129.03  130.19   761134  4.033301e+09           0.70   \n",
      "\n",
      "        time                           id  \n",
      "0 2022-01-04  (中国平安, 2022-01-11 00:00:00)  \n",
      "1 2022-01-05  (中国平安, 2022-01-11 00:00:00)  \n",
      "2 2022-01-06  (中国平安, 2022-01-11 00:00:00)  \n",
      "3 2022-01-07  (中国平安, 2022-01-11 00:00:00)  \n",
      "4 2022-01-10  (中国平安, 2022-01-11 00:00:00)  \n",
      "shape:  (5571, 10)\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "df.drop(columns=['code'], inplace=True)  # 删除股票代码code列, inplace为直接修改df，否则需要赋值给新的变量\n",
    "# fixme:由于index列无法获取或指定列名（也许可以实现，但试了好几种方法都报错），新生成一列作为时间，把index的时间赋值这一列\n",
    "df['time'] = df.index\n",
    "# 滚动处理时间序列，指定id列和时间列，滚动处理时序数据\n",
    "df_rolled = roll_time_series(df, column_id=\"name\", column_sort=\"time\",\n",
    "                             max_timeshift=20, min_timeshift=5)\n",
    "print(df_rolled.head())\n",
    "print('shape: ', df_rolled.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "     open    high     low   close   volume      turnover  turnover_rate  \\\n",
      "0  124.83  126.15  124.23  126.03   635838  3.221367e+09           0.59   \n",
      "1  126.25  128.83  125.97  128.17  1181247  6.124174e+09           1.09   \n",
      "2  128.01  128.07  126.47  126.63   661658  3.408948e+09           0.61   \n",
      "3  127.01  130.69  126.93  129.91  1230760  6.481039e+09           1.14   \n",
      "4  130.01  131.15  129.03  130.19   761134  4.033301e+09           0.70   \n",
      "\n",
      "        time                           id  \n",
      "0 2022-01-04  (中国平安, 2022-01-11 00:00:00)  \n",
      "1 2022-01-05  (中国平安, 2022-01-11 00:00:00)  \n",
      "2 2022-01-06  (中国平安, 2022-01-11 00:00:00)  \n",
      "3 2022-01-07  (中国平安, 2022-01-11 00:00:00)  \n",
      "4 2022-01-10  (中国平安, 2022-01-11 00:00:00)  \n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "# name为股票名的列，不作为特征，所以删除\n",
    "df_rolled.drop(columns=['name'], inplace=True)  # 删除name列, inplace为直接修改df，否则需要赋值给新的变量\n",
    "print(df_rolled.head())"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 4. 特征工程\n",
    "## 4.1 特征提取"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [
    {
     "name": "stderr",
     "text": [
      "\n",
      "Feature Extraction:   0%|          | 0/30 [00:00<?, ?it/s]\u001b[A\n",
      "Feature Extraction:   3%|▎         | 1/30 [00:16<07:46, 16.10s/it]\u001b[A\n",
      "Feature Extraction:   7%|▋         | 2/30 [00:16<05:20, 11.46s/it]\u001b[A\n",
      "Feature Extraction:  10%|█         | 3/30 [00:17<03:41,  8.21s/it]\u001b[A\n",
      "Feature Extraction:  13%|█▎        | 4/30 [00:17<02:30,  5.78s/it]\u001b[A\n",
      "Feature Extraction:  17%|█▋        | 5/30 [00:17<01:42,  4.09s/it]\u001b[A\n",
      "Feature Extraction:  20%|██        | 6/30 [00:18<01:12,  3.04s/it]\u001b[A\n",
      "100%|██████████| 1/1 [06:42<00:00, 402.38s/it]26<01:45,  4.58s/it]\u001b[A\n",
      "\n",
      "Feature Extraction:  27%|██▋       | 8/30 [00:27<01:16,  3.46s/it]\u001b[A\n",
      "Feature Extraction:  30%|███       | 9/30 [00:27<00:52,  2.49s/it]\u001b[A\n",
      "Feature Extraction:  33%|███▎      | 10/30 [00:27<00:35,  1.77s/it]\u001b[A\n",
      "Feature Extraction:  43%|████▎     | 13/30 [00:33<00:31,  1.83s/it]\u001b[A\n",
      "Feature Extraction:  50%|█████     | 15/30 [00:33<00:19,  1.31s/it]\u001b[A\n",
      "Feature Extraction:  53%|█████▎    | 16/30 [00:33<00:13,  1.05it/s]\u001b[A\n",
      "Feature Extraction:  60%|██████    | 18/30 [00:33<00:08,  1.43it/s]\u001b[A\n",
      "Feature Extraction:  63%|██████▎   | 19/30 [00:39<00:22,  2.05s/it]\u001b[A\n",
      "Feature Extraction:  67%|██████▋   | 20/30 [00:40<00:17,  1.75s/it]\u001b[A\n",
      "Feature Extraction:  70%|███████   | 21/30 [00:40<00:11,  1.29s/it]\u001b[A\n",
      "Feature Extraction:  73%|███████▎  | 22/30 [00:40<00:07,  1.07it/s]\u001b[A\n",
      "Feature Extraction:  83%|████████▎ | 25/30 [00:47<00:06,  1.31s/it]\u001b[A\n",
      "Feature Extraction:  87%|████████▋ | 26/30 [00:48<00:05,  1.43s/it]\u001b[A\n",
      "Feature Extraction:  90%|█████████ | 27/30 [00:49<00:03,  1.07s/it]\u001b[A\n",
      "Feature Extraction:  93%|█████████▎| 28/30 [00:50<00:02,  1.01s/it]\u001b[A\n",
      "Feature Extraction: 100%|██████████| 30/30 [00:50<00:00,  1.68s/it]\u001b[A\n"
     ],
     "output_type": "stream"
    },
    {
     "data": {
      "text/plain": "                 open__variance_larger_than_standard_deviation  \\\n中国平安 2022-01-11                                            1.0   \n     2022-01-12                                            1.0   \n     2022-01-13                                            1.0   \n     2022-01-14                                            1.0   \n     2022-01-17                                            1.0   \n\n                 open__has_duplicate_max  open__has_duplicate_min  \\\n中国平安 2022-01-11                      0.0                      0.0   \n     2022-01-12                      0.0                      0.0   \n     2022-01-13                      0.0                      0.0   \n     2022-01-14                      0.0                      0.0   \n     2022-01-17                      0.0                      0.0   \n\n                 open__has_duplicate  open__sum_values  open__abs_energy  \\\n中国平安 2022-01-11                  0.0            766.48        97938.6286   \n     2022-01-12                  0.0            895.71       114639.0215   \n     2022-01-13                  0.0           1024.84       131313.5784   \n     2022-01-14                  0.0           1153.57       147884.9913   \n     2022-01-17                  1.0           1279.82       163824.0538   \n\n                 open__mean_abs_change  open__mean_change  \\\n中国平安 2022-01-11               1.508000           1.108000   \n     2022-01-12               1.446667           0.733333   \n     2022-01-13               1.254286           0.614286   \n     2022-01-14               1.147500           0.487500   \n     2022-01-17               1.295556           0.157778   \n\n                 open__mean_second_derivative_central  open__median  ...  \\\n中国平安 2022-01-11                             -0.132500        127.51  ...   \n     2022-01-12                             -0.256000        128.01  ...   \n     2022-01-13                             -0.126667        128.57  ...   \n     2022-01-14                             -0.130000        128.73  ...   \n     2022-01-17                             -0.243750        128.37  ...   \n\n                 turnover_rate__fourier_entropy__bins_5  \\\n中国平安 2022-01-11                                1.039721   \n     2022-01-12                                1.386294   \n     2022-01-13                                0.950271   \n     2022-01-14                                0.950271   \n     2022-01-17                                1.329661   \n\n                 turnover_rate__fourier_entropy__bins_10  \\\n中国平安 2022-01-11                                 1.386294   \n     2022-01-12                                 1.386294   \n     2022-01-13                                 1.332179   \n     2022-01-14                                 0.950271   \n     2022-01-17                                 1.329661   \n\n                 turnover_rate__fourier_entropy__bins_100  \\\n中国平安 2022-01-11                                  1.386294   \n     2022-01-12                                  1.386294   \n     2022-01-13                                  1.609438   \n     2022-01-14                                  1.609438   \n     2022-01-17                                  1.791759   \n\n                 turnover_rate__permutation_entropy__dimension_3__tau_1  \\\n中国平安 2022-01-11                                           1.039721        \n     2022-01-12                                           1.054920        \n     2022-01-13                                           1.098612        \n     2022-01-14                                           1.351784        \n     2022-01-17                                           1.559581        \n\n                 turnover_rate__permutation_entropy__dimension_4__tau_1  \\\n中国平安 2022-01-11                                           1.098612        \n     2022-01-12                                           1.386294        \n     2022-01-13                                           1.609438        \n     2022-01-14                                           1.791759        \n     2022-01-17                                           1.945910        \n\n                 turnover_rate__permutation_entropy__dimension_5__tau_1  \\\n中国平安 2022-01-11                                           0.693147        \n     2022-01-12                                           1.098612        \n     2022-01-13                                           1.386294        \n     2022-01-14                                           1.609438        \n     2022-01-17                                           1.791759        \n\n                 turnover_rate__permutation_entropy__dimension_6__tau_1  \\\n中国平安 2022-01-11                                          -0.000000        \n     2022-01-12                                           0.693147        \n     2022-01-13                                           1.098612        \n     2022-01-14                                           1.386294        \n     2022-01-17                                           1.609438        \n\n                 turnover_rate__permutation_entropy__dimension_7__tau_1  \\\n中国平安 2022-01-11                                           2.708050        \n     2022-01-12                                          -0.000000        \n     2022-01-13                                           0.693147        \n     2022-01-14                                           1.098612        \n     2022-01-17                                           1.386294        \n\n                 turnover_rate__query_similarity_count__query_None__threshold_0.0  \\\n中国平安 2022-01-11                                                0.0                  \n     2022-01-12                                                0.0                  \n     2022-01-13                                                0.0                  \n     2022-01-14                                                0.0                  \n     2022-01-17                                                0.0                  \n\n                 turnover_rate__mean_n_absolute_max__number_of_maxima_7  \n中国平安 2022-01-11                                           0.745714       \n     2022-01-12                                           0.745714       \n     2022-01-13                                           0.775714       \n     2022-01-14                                           0.794286       \n     2022-01-17                                           0.794286       \n\n[5 rows x 5481 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th></th>\n      <th>open__variance_larger_than_standard_deviation</th>\n      <th>open__has_duplicate_max</th>\n      <th>open__has_duplicate_min</th>\n      <th>open__has_duplicate</th>\n      <th>open__sum_values</th>\n      <th>open__abs_energy</th>\n      <th>open__mean_abs_change</th>\n      <th>open__mean_change</th>\n      <th>open__mean_second_derivative_central</th>\n      <th>open__median</th>\n      <th>...</th>\n      <th>turnover_rate__fourier_entropy__bins_5</th>\n      <th>turnover_rate__fourier_entropy__bins_10</th>\n      <th>turnover_rate__fourier_entropy__bins_100</th>\n      <th>turnover_rate__permutation_entropy__dimension_3__tau_1</th>\n      <th>turnover_rate__permutation_entropy__dimension_4__tau_1</th>\n      <th>turnover_rate__permutation_entropy__dimension_5__tau_1</th>\n      <th>turnover_rate__permutation_entropy__dimension_6__tau_1</th>\n      <th>turnover_rate__permutation_entropy__dimension_7__tau_1</th>\n      <th>turnover_rate__query_similarity_count__query_None__threshold_0.0</th>\n      <th>turnover_rate__mean_n_absolute_max__number_of_maxima_7</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th rowspan=\"5\" valign=\"top\">中国平安</th>\n      <th>2022-01-11</th>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>766.48</td>\n      <td>97938.6286</td>\n      <td>1.508000</td>\n      <td>1.108000</td>\n      <td>-0.132500</td>\n      <td>127.51</td>\n      <td>...</td>\n      <td>1.039721</td>\n      <td>1.386294</td>\n      <td>1.386294</td>\n      <td>1.039721</td>\n      <td>1.098612</td>\n      <td>0.693147</td>\n      <td>-0.000000</td>\n      <td>2.708050</td>\n      <td>0.0</td>\n      <td>0.745714</td>\n    </tr>\n    <tr>\n      <th>2022-01-12</th>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>895.71</td>\n      <td>114639.0215</td>\n      <td>1.446667</td>\n      <td>0.733333</td>\n      <td>-0.256000</td>\n      <td>128.01</td>\n      <td>...</td>\n      <td>1.386294</td>\n      <td>1.386294</td>\n      <td>1.386294</td>\n      <td>1.054920</td>\n      <td>1.386294</td>\n      <td>1.098612</td>\n      <td>0.693147</td>\n      <td>-0.000000</td>\n      <td>0.0</td>\n      <td>0.745714</td>\n    </tr>\n    <tr>\n      <th>2022-01-13</th>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1024.84</td>\n      <td>131313.5784</td>\n      <td>1.254286</td>\n      <td>0.614286</td>\n      <td>-0.126667</td>\n      <td>128.57</td>\n      <td>...</td>\n      <td>0.950271</td>\n      <td>1.332179</td>\n      <td>1.609438</td>\n      <td>1.098612</td>\n      <td>1.609438</td>\n      <td>1.386294</td>\n      <td>1.098612</td>\n      <td>0.693147</td>\n      <td>0.0</td>\n      <td>0.775714</td>\n    </tr>\n    <tr>\n      <th>2022-01-14</th>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1153.57</td>\n      <td>147884.9913</td>\n      <td>1.147500</td>\n      <td>0.487500</td>\n      <td>-0.130000</td>\n      <td>128.73</td>\n      <td>...</td>\n      <td>0.950271</td>\n      <td>0.950271</td>\n      <td>1.609438</td>\n      <td>1.351784</td>\n      <td>1.791759</td>\n      <td>1.609438</td>\n      <td>1.386294</td>\n      <td>1.098612</td>\n      <td>0.0</td>\n      <td>0.794286</td>\n    </tr>\n    <tr>\n      <th>2022-01-17</th>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>1279.82</td>\n      <td>163824.0538</td>\n      <td>1.295556</td>\n      <td>0.157778</td>\n      <td>-0.243750</td>\n      <td>128.37</td>\n      <td>...</td>\n      <td>1.329661</td>\n      <td>1.329661</td>\n      <td>1.791759</td>\n      <td>1.559581</td>\n      <td>1.945910</td>\n      <td>1.791759</td>\n      <td>1.609438</td>\n      <td>1.386294</td>\n      <td>0.0</td>\n      <td>0.794286</td>\n    </tr>\n  </tbody>\n</table>\n<p>5 rows × 5481 columns</p>\n</div>"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 31
    }
   ],
   "source": [
    "# 提取特征，可以指定特征列（不指定即所有的列）\n",
    "X = extract_features(df_rolled, \n",
    "                     column_id=\"id\", column_sort=\"time\", # column_value=\"high\", \n",
    "                     impute_function=impute)  # , show_warnings=False)\n",
    "X.head()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "                    open__variance_larger_than_standard_deviation  \\\n",
      "Symbols last_date                                                   \n",
      "中国平安    2022-01-11                                            1.0   \n",
      "        2022-01-12                                            1.0   \n",
      "        2022-01-13                                            1.0   \n",
      "        2022-01-14                                            1.0   \n",
      "        2022-01-17                                            1.0   \n",
      "\n",
      "                    open__has_duplicate_max  open__has_duplicate_min  \\\n",
      "Symbols last_date                                                      \n",
      "中国平安    2022-01-11                      0.0                      0.0   \n",
      "        2022-01-12                      0.0                      0.0   \n",
      "        2022-01-13                      0.0                      0.0   \n",
      "        2022-01-14                      0.0                      0.0   \n",
      "        2022-01-17                      0.0                      0.0   \n",
      "\n",
      "                    open__has_duplicate  open__sum_values  open__abs_energy  \\\n",
      "Symbols last_date                                                             \n",
      "中国平安    2022-01-11                  0.0            766.48        97938.6286   \n",
      "        2022-01-12                  0.0            895.71       114639.0215   \n",
      "        2022-01-13                  0.0           1024.84       131313.5784   \n",
      "        2022-01-14                  0.0           1153.57       147884.9913   \n",
      "        2022-01-17                  1.0           1279.82       163824.0538   \n",
      "\n",
      "                    open__mean_abs_change  open__mean_change  \\\n",
      "Symbols last_date                                              \n",
      "中国平安    2022-01-11               1.508000           1.108000   \n",
      "        2022-01-12               1.446667           0.733333   \n",
      "        2022-01-13               1.254286           0.614286   \n",
      "        2022-01-14               1.147500           0.487500   \n",
      "        2022-01-17               1.295556           0.157778   \n",
      "\n",
      "                    open__mean_second_derivative_central  open__median  ...  \\\n",
      "Symbols last_date                                                       ...   \n",
      "中国平安    2022-01-11                             -0.132500        127.51  ...   \n",
      "        2022-01-12                             -0.256000        128.01  ...   \n",
      "        2022-01-13                             -0.126667        128.57  ...   \n",
      "        2022-01-14                             -0.130000        128.73  ...   \n",
      "        2022-01-17                             -0.243750        128.37  ...   \n",
      "\n",
      "                    turnover_rate__fourier_entropy__bins_5  \\\n",
      "Symbols last_date                                            \n",
      "中国平安    2022-01-11                                1.039721   \n",
      "        2022-01-12                                1.386294   \n",
      "        2022-01-13                                0.950271   \n",
      "        2022-01-14                                0.950271   \n",
      "        2022-01-17                                1.329661   \n",
      "\n",
      "                    turnover_rate__fourier_entropy__bins_10  \\\n",
      "Symbols last_date                                             \n",
      "中国平安    2022-01-11                                 1.386294   \n",
      "        2022-01-12                                 1.386294   \n",
      "        2022-01-13                                 1.332179   \n",
      "        2022-01-14                                 0.950271   \n",
      "        2022-01-17                                 1.329661   \n",
      "\n",
      "                    turnover_rate__fourier_entropy__bins_100  \\\n",
      "Symbols last_date                                              \n",
      "中国平安    2022-01-11                                  1.386294   \n",
      "        2022-01-12                                  1.386294   \n",
      "        2022-01-13                                  1.609438   \n",
      "        2022-01-14                                  1.609438   \n",
      "        2022-01-17                                  1.791759   \n",
      "\n",
      "                    turnover_rate__permutation_entropy__dimension_3__tau_1  \\\n",
      "Symbols last_date                                                            \n",
      "中国平安    2022-01-11                                           1.039721        \n",
      "        2022-01-12                                           1.054920        \n",
      "        2022-01-13                                           1.098612        \n",
      "        2022-01-14                                           1.351784        \n",
      "        2022-01-17                                           1.559581        \n",
      "\n",
      "                    turnover_rate__permutation_entropy__dimension_4__tau_1  \\\n",
      "Symbols last_date                                                            \n",
      "中国平安    2022-01-11                                           1.098612        \n",
      "        2022-01-12                                           1.386294        \n",
      "        2022-01-13                                           1.609438        \n",
      "        2022-01-14                                           1.791759        \n",
      "        2022-01-17                                           1.945910        \n",
      "\n",
      "                    turnover_rate__permutation_entropy__dimension_5__tau_1  \\\n",
      "Symbols last_date                                                            \n",
      "中国平安    2022-01-11                                           0.693147        \n",
      "        2022-01-12                                           1.098612        \n",
      "        2022-01-13                                           1.386294        \n",
      "        2022-01-14                                           1.609438        \n",
      "        2022-01-17                                           1.791759        \n",
      "\n",
      "                    turnover_rate__permutation_entropy__dimension_6__tau_1  \\\n",
      "Symbols last_date                                                            \n",
      "中国平安    2022-01-11                                          -0.000000        \n",
      "        2022-01-12                                           0.693147        \n",
      "        2022-01-13                                           1.098612        \n",
      "        2022-01-14                                           1.386294        \n",
      "        2022-01-17                                           1.609438        \n",
      "\n",
      "                    turnover_rate__permutation_entropy__dimension_7__tau_1  \\\n",
      "Symbols last_date                                                            \n",
      "中国平安    2022-01-11                                           2.708050        \n",
      "        2022-01-12                                          -0.000000        \n",
      "        2022-01-13                                           0.693147        \n",
      "        2022-01-14                                           1.098612        \n",
      "        2022-01-17                                           1.386294        \n",
      "\n",
      "                    turnover_rate__query_similarity_count__query_None__threshold_0.0  \\\n",
      "Symbols last_date                                                                      \n",
      "中国平安    2022-01-11                                                0.0                  \n",
      "        2022-01-12                                                0.0                  \n",
      "        2022-01-13                                                0.0                  \n",
      "        2022-01-14                                                0.0                  \n",
      "        2022-01-17                                                0.0                  \n",
      "\n",
      "                    turnover_rate__mean_n_absolute_max__number_of_maxima_7  \n",
      "Symbols last_date                                                           \n",
      "中国平安    2022-01-11                                           0.745714       \n",
      "        2022-01-12                                           0.745714       \n",
      "        2022-01-13                                           0.775714       \n",
      "        2022-01-14                                           0.794286       \n",
      "        2022-01-17                                           0.794286       \n",
      "\n",
      "[5 rows x 5481 columns]\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "# 通过给数据一个多索引而不是元组索引，让数据更容易处理\n",
    "X = X.set_index([X.index.map(lambda x: x[0]), X.index.map(lambda x: x[1])], drop=True)\n",
    "X.index.names = [\"Symbols\", \"last_date\"]\n",
    "print(X.head())"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 4.2 标签制作"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "name  time      \n",
      "中国平安  2022-01-04    128.17\n",
      "      2022-01-05    126.63\n",
      "      2022-01-06    129.91\n",
      "      2022-01-07    130.19\n",
      "      2022-01-10    129.75\n",
      "dtype: float64\n",
      "shape:  (276,)\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "# 或将每只股票分别编号: 按date排列，以close(收盘价)为index，向未来移动1个时间步，引入与上面X相同的多索引格式\n",
    "y = df.groupby(\"name\").apply(lambda x: x.set_index(\"time\")[\"close\"].shift(-1)).T.unstack()\n",
    "print(y.head())\n",
    "print('shape: ', y.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "outputs": [
    {
     "data": {
      "text/plain": "(128.17, 126.63)"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 39
    }
   ],
   "source": [
    "# 一致性测试，查看日期是否挪动了一步，即避免看到未来：\n",
    "y[0], y[1]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "outputs": [],
   "source": [
    "# 保持X和y标签时间一致\n",
    "y = y[y.index.isin(X.index)]\n",
    "X = X[X.index.isin(y.index)]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 4.3 训练数据准备"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "outputs": [],
   "source": [
    "# 分解为train和test样本的工作原理与单个标识符相同，但这一次我们有一个多索引符号-日期，因此loc调用看起来更复杂一些\n",
    "\n",
    "X_train = X.loc[(slice(None), slice(None, \"2022-12-31\")), :]\n",
    "X_test = X.loc[(slice(None), slice(\"2023-01-01\", \"2023-02-26\")), :]\n",
    "\n",
    "y_train = y.loc[(slice(None), slice(None, \"2022-12-31\"))]\n",
    "y_test = y.loc[(slice(None), slice(\"2023-01-01\", \"2023-02-26\"))]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "X_train (237, 5481)\n",
      "X_test (34, 5481)\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "print('X_train', X_train.shape)\n",
    "print('X_test', X_test.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "outputs": [],
   "source": [
    "# 特征选择\n",
    "X_train_selected = select_features(X_train, y_train)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "X_train_selected (237, 1456)\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "print('X_train_selected', X_train_selected.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 5. 模型训练"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "outputs": [
    {
     "data": {
      "text/plain": "AdaBoostRegressor()"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 45
    }
   ],
   "source": [
    "# 模型训练\n",
    "adas = AdaBoostRegressor()\n",
    "# 如果数据中有多支股票，可以筛选出来\n",
    "# ada.fit(X_train_selected.loc[stock], y_train.loc[stock])\n",
    "adas.fit(X_train_selected, y_train)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 6. 预测"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "y_pred Symbols  last_date \n",
      "中国平安     2023-01-03    115.630000\n",
      "         2023-01-04    113.519091\n",
      "         2023-01-05    113.680649\n",
      "         2023-01-06    113.747174\n",
      "         2023-01-09    113.722895\n",
      "         2023-01-10    114.695641\n",
      "         2023-01-11    113.747174\n",
      "         2023-01-12    114.496866\n",
      "         2023-01-13    117.075217\n",
      "         2023-01-16    117.075217\n",
      "         2023-01-17    117.959091\n",
      "         2023-01-18    119.612500\n",
      "         2023-01-19    119.786129\n",
      "         2023-01-20    119.002500\n",
      "         2023-01-30    119.612500\n",
      "         2023-01-31    119.786129\n",
      "         2023-02-01    119.456667\n",
      "         2023-02-02    119.889394\n",
      "         2023-02-03    121.251622\n",
      "         2023-02-06    123.290000\n",
      "         2023-02-07    124.037500\n",
      "         2023-02-08    123.131481\n",
      "         2023-02-09    123.131481\n",
      "         2023-02-10    121.928537\n",
      "         2023-02-13    121.928537\n",
      "         2023-02-14    121.928537\n",
      "         2023-02-15    121.773333\n",
      "         2023-02-16    120.492456\n",
      "         2023-02-17    119.981667\n",
      "         2023-02-20    119.353810\n",
      "         2023-02-21    117.655833\n",
      "         2023-02-22    113.722895\n",
      "         2023-02-23    113.608507\n",
      "         2023-02-24    116.830000\n",
      "dtype: float64\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "# 预测\n",
    "# 特征选择\n",
    "X_test_selected = X_test[X_train_selected.columns]\n",
    "\n",
    "# 如果多支股票，使用如下注释代码\n",
    "# y_pred = pd.concat({\n",
    "#     stock: pd.Series(adas[stock].predict(X_test_selected.loc[stock]), index=X_test_selected.loc[stock].index)\n",
    "#     for stock in adas.keys()\n",
    "# })\n",
    "y_pred = pd.Series(adas.predict(X_test_selected), index=X_test_selected.index)\n",
    "y_pred.index.names = [\"Symbols\", \"last_date\"]\n",
    "print('y_pred', y_pred)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "outputs": [
    {
     "data": {
      "text/plain": "<AxesSubplot:xlabel='Symbols,last_date'>"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 52
    },
    {
     "data": {
      "text/plain": "<Figure size 1080x432 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15, 6))\n",
    "\n",
    "y_test.plot(ax=plt.gca())\n",
    "y_pred.plot(ax=plt.gca(), legend=None, marker=\".\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 参考\n",
    "[1] [ML]tsfresh:时序数据特征自动提取工具, https://mp.weixin.qq.com/s/Pi5YIW2ywLbdoVkwZl0nVQ\n",
    "[2] 时间序列学习 经典案例（1）【tsfresh】预测多只股票, https://blog.csdn.net/qq_42658739/article/details/122425952"
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "name": "pycharm-3ea5732f",
   "language": "python",
   "display_name": "PyCharm (ai_quant_trade)"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "source": [],
    "metadata": {
     "collapsed": false
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}